--[[
    @desc 事件管理器  目前是写了两个事件处理方式
    @author zch
    @data:2022-04-20 9:30:00
]]

LuaEventManager = LuaEventManager or BaseClass()
local LuaEventManager = LuaEventManager
local _pcall = pcall
local _xpcall = xpcall

function LuaEventManager:__init()
	self.key_map = {}
	self.global_event_1 = {}
	self.calling_event_dic = {} --定义一个正在调用中的函数列表
	self.global_event_2 = EventSystem.New()
end

function LuaEventManager:GetInstance()
	if LuaEventManager.Instance == nil then
		LuaEventManager.Instance = LuaEventManager.New()
	end
	return LuaEventManager.Instance
end

--[[
	@desc : 使用自定义事件来管理  该系统中会把方法地址转换为字符串  然后当作事件系统中绑定的唯一值
]]
function LuaEventManager:AddListener(event_key, func)
	local event_list = self.global_event_1[event_key]
	if not event_list then
		event_list = {}
		self.global_event_1[event_key] = event_list
	end
	local key = tostring(func)
	self.key_map[key] = event_key
	event_list[key] = func
	return key
end

function LuaEventManager:RemoveListener(key)
	local event_key = self.key_map[key]
	if event_key then
		local calling_event = self.calling_event_dic[event_key]
		-- 如果此时的事件正在触发  则要先保留下要移除的事件
		if calling_event ~= nil then
			if calling_event == false then
				calling_event = {}
				self.calling_event_dic[event_key] = calling_event
			end
			calling_event[key] = true
			local event_list = self.global_event_1[event_key]
			if event_list then
				event_list[key] = false
			end
			return
		end
		local event_list = self.global_event_1[event_key]
		if event_list[key] then
			event_list[key] = nil
			self.key_map[key] = nil
		end
	end
end

function LuaEventManager:Trigger(event_key, ...)
	local event_list = self.global_event_1[event_key]
	if event_list then
		self.calling_event_dic[event_key] = false
		for _, func in pairs(event_list) do
			-- _xpcall(func)
			func(...)
		end
		local calling_event = self.calling_event_dic[event_key]
		self.calling_event_dic[event_key] = nil
		-- 确保触发完事件再移除
		if calling_event then
			for key, _ in pairs(calling_event) do
				self:RemoveListener(key)
			end
		end
	end
end

function LuaEventManager:Clear()
	-- self.calling_event_dic = {}
end

-- --[[
-- 	@desc : 使用EventSystem来管理事件系统  该系统中会用一个自增的id来当作方法绑定的唯一值
-- ]]
-- function LuaEventManager:Bind(event_key, func)
-- 	return EventSystem.Bind(self.global_event_2, event_key, func)
-- end

-- function LuaEventManager:UnBind(event_id)
-- 	EventSystem.UnBind(self.global_event_2, event_id)
-- end

-- function LuaEventManager:Fire(event_key, ...)
-- 	EventSystem.Fire(self.global_event_2, event_key, ...)
-- end